package br.requisiteworks.seguranca.modelo.servico;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.requisiteworks.seguranca.modelo.Funcao;
import br.requisiteworks.seguranca.modelo.Usuario;
import br.requisiteworks.seguranca.modelo.dao.FuncaoDao;
import br.requisiteworks.seguranca.modelo.dao.UserDao;
import br.requisiteworks.util.persistencia.ErroBancoDados;
import br.requisiteworks.util.persistencia.ResultadoVazio;

@Service
public class SecurityService {

	private final Log log = LogFactory.getLog(SecurityService.class);

	@Autowired
	private FuncaoDao funcaoDao;
	@Autowired
	private UserDao userDao;

	public void salvarUsuario(Usuario usuario) {

		try {
			this.userDao.select(usuario.getUsername());
			log.warn("Tentativa de cadastro de usuario ja existente: "
					+ usuario.getUsername());
		} catch (ResultadoVazio e) {
			try {
				this.userDao.insert(usuario);
				log.info("Usuario cadastrado: " + usuario);
			} catch (ErroBancoDados ex) {
				log.error("Erro ao cadastrar usuario: " + usuario, ex);
			}
		}

	}

	public List<Funcao> listarFuncoes() throws ResultadoVazio {
		return this.funcaoDao.select();
	}

	public Funcao getFuncao(int numero) throws ResultadoVazio {
		return this.funcaoDao.select(numero);
	}

	public List<Usuario> getUsuarios() throws ResultadoVazio {
		return this.userDao.select();
	}

	public Usuario getUsuario(String username) throws ResultadoVazio {
		return this.userDao.select(username);
	}

	public void atualizaUsuario(Usuario usuario) throws ErroBancoDados {
		this.userDao.update(usuario);
		log.info("Usuario atualizado: " + usuario);
	}

	public Funcao getFuncao(String string) throws ResultadoVazio {
		return this.funcaoDao.select(string);
	}
}
